/* 
 * File:   Laser.hpp
 * Definicion de clase que modela los lasers utilizados en el juego
 */

#ifndef LASER_HPP
#define	LASER_HPP

#include "ObjetoGrafico.hpp"

class Laser : public ObjetoGrafico {
public:
    /**
     * Constructor de la clase Laser
     * 
     * @param light : Enumeracion que indica la luz de openGL a utilizar en el laser
     * @param pos_x : Posicion inicial en el eje X 
     * @param pos_y : Posicion inicial en el eje Y
     * @param pos_z : Posicion inicial en el eje Z
     */
    Laser(GLenum light, GLfloat pos_x = 0.0, GLfloat pos_y = 0.0, GLfloat pos_z = 0.0);

    /**
     * Metodo que permite dibujar el laser en la escena si este se encuentra
     * activo( fue disparado por la nave)
     */
    virtual void dibujar();


    /**
     * Metodo idle del laser, permite calcular su movimiento.
     * @param s : El frameskip actual.
     */
    virtual void idle(int s);



    /**
     * Este metodo permite colocar una posicion inicial al laser antes de 
     * ser disparado. 
     * 
     * @param px : Posicion en el eje X.
     * @param py : Posicion en el eje Y.
     * @param pz : Posicion en el eje Z.
     */
    void setInitialPosition(GLfloat px, GLfloat py, GLfloat pz); //colocar posicion inicial
    GLfloat * getPosition();


    /**
     * Este metodo habilita el laser para ser dibujado despues de ser disparado
     */
    void activar();


    /**
     * Este metodo deshabilita el laser y lo hace invisible en la escena.
     * @param apagar : Indica si se quiere desactivar tambien la luz del laser(true).
     */
    void desactivar(bool apagar);


    /**
     * Esta funcion indica si el laser esta activado(true) o no(false).
     * @return activado(true) o no(false).
     */
    bool activado();

    /**
     * Esta funcion permite obtener la enumeracion que corresponde a la luz 
     * asignada al laser.
     * 
     * @return La enumeracion de OpenGL que corresponde a la luz utilizada. 
     */
    GLenum getLuz(); //obtener la luz asignada al laser


    /**
     * Este metodo permite restaurar los valores por defecto del laser
     */
    void restaurarLuz();


    /**
     * Este metodo permite indicar al laser la posicion de su objetivo.
     * 
     * @param x2 : La posicion del Objetivo en el eje X.
     * @param y2 : La posicion del Objetivo en el eje Y.
     * @param z2 : La posicion del Objetivo en el eje Z.
     */
    void setTarget(GLfloat x2, GLfloat y2, GLfloat z2);


private:
    /**
     * Este metodo permite mover el laser mediante un vector de velocidad.
     * 
     * @param s: El frameskip actual.
     */
    void vectorialMove(int s);

    bool activo; //indica si el laser fue disparado o no
    GLfloat tope; //hasta que profundidad debe llegar el laser en la escena
    GLfloat initial[3]; //posicion inicial
    GLenum luz; //luz asignada
    GLfloat vector[3]; //vector de movimiento

};


#endif	/* LASER_HPP */

